多媒体数据库
以 root 权限进入 adb shell, /data/data/com.android.providers.media/databases 目录下就是存放数据库的地方。
以 external 开头的数据库存储的是 SD 卡媒体信息,一张卡对应一个,所以如果手机使用过多张卡会有多个数据库。以 internal
开头的数据库存储手机内部存储器的媒体信息。因为一般用户无法访问手机内部存储器,而且这两个数据库结构是大体上是相同的,所以只需要关注
external 数据库即可。
图片数据库
由两个表组成,images和thumbnails
images 图片
| 字段 |
解析 |
| _id |
主键。图片 id,从 1 开始自增 |
| _data |
图片绝对路径 |
| _size |
文件大小,单位为 byte |
| _display_name |
文件名 |
| mime_type |
类似于 image/jpeg 的 MIME 类型 |
| title |
不带扩展名的文件名(数据库里也存在部分带有扩展名的) |
| date_added |
添加到数据库的时间,单位秒 |
| date_modified |
文件最后修改时间,单位秒 |
| description |
|
| picasa_id |
用于 picasa 网络相册 |
| isprivate |
|
| latitude |
纬度,需要照片有 GPS 信息 |
| longitude |
经度,需要照片有 GPS 信息 |
| datetaken |
取自 EXIF 照片拍摄时间,若为空则等于文件修改时间,单位毫秒 |
| orientation |
取自 EXIF 旋转角度,在图库旋转图片也会改变此值 |
| mini_thumb_magic |
取小缩略图时生成的一个随机数,见 MediaThumbRequest |
| bucket_id |
相册(文件夹)id。等于 path.toLowerCase.hashCode(),见MediaProvider.computeBucketValues() |
| bucket_display_name |
直接包含图片的文件夹就是该图片的 bucket,就是文件夹名 |
| width |
图片宽度 |
| height |
图片高度 |
thumbnails 缩略图
| 字段 |
解析 |
| _id |
主键。缩略图 id,从 1 开始自增 |
| _data |
图片绝对路径 |
| image_id |
缩略图所对应图片的 id,依赖于 images 表 _id 字段,可建立外键 |
| kind |
缩略图类型,1 是大缩略图,2 基本不用,3 是微型缩略图但其信息不保存在数据库 |
| width |
缩略图宽度 |
| height |
缩略图高度 |
视频数据库
video
| 字段 |
解析 |
| _id |
主键。视频 id |
| _data |
视频绝对路径 |
| _display_name |
文件名 |
| _size |
文件大小,单位为 byte |
| mime_type |
类似于 video/avi 的 MIME 类型 |
| date_added |
添加到数据库的时间,单位秒 |
| date_modified |
文件最后修改时间,单位秒 |
| title |
不带扩展名的文件名 |
| duration |
视频时长,单位毫秒 |
| artist |
艺术家 |
| album |
专辑名,一般为文件夹名 |
| resolution |
分辨率 |
| description |
|
| isprivate |
|
| tags |
|
| category |
|
| language |
|
| mini_thumb_data |
|
| latitude |
经度 |
| longitude |
纬度 |
| datetaken |
录制时间,单位毫秒 |
| mini_thumb_magic |
取小缩略图时生成的一个随机数,见 MediaThumbRequest |
| bucket_id |
等于 path.toLowerCase.hashCode(),见 MediaProvider.computeBucketValues() |
| bucket_display_name |
直接包含视频的文件夹就是该图片的 bucket,就是文件夹名 |
| bookmark |
|
| width |
视频宽度 |
| height |
视频高度 |
videothumbnails
| 字段 |
解析 |
| _id |
主键。缩略图 id |
| _data |
缩略图绝对路径 |
| video_id |
缩略图所对应视频的 id,依赖于 video 表 _id 字段 |
| kind |
缩略图类型,1 是大图,视频只能取类型 1 |
| width |
缩略图宽度 |
| height |
缩略图高度 |
音频数据库
这个比较复杂,由多个表组成
album_art:专辑封面
| 字段 |
解析 |
| album_id |
主键。专辑 id |
| _data |
专辑封面缓存的路径 |
albums:专辑
| 字段 |
解析 |
| album_id |
主键。专辑 id |
| album_key |
全大写字母,用于字母索引 |
| album |
专辑名 |
album_info:专辑信息
| 字段 |
解析 |
| _id |
主键 |
| album |
专辑名 |
| album_key |
专辑key |
| minyear |
年代 |
| maxyear |
|
| artist |
艺术家 |
| artist_id |
艺术家id |
| artist_key |
艺术家key |
| numsongs |
歌曲数量 |
| album_art |
| 字段 |
解析 |
| locale |
默认字符编码,例如 zh_CN |
artists:艺术家
| 字段 |
解析 |
| artist_id |
主键。艺术家 id |
| artist_key |
全大写字母,用于字母索引 |
| artist |
艺术家 |
artist_info
| 字段 |
解析 |
| _id |
主键。映射 id |
| artist |
艺术家 |
| artist_key |
|
| number_of_albums |
|
| number_of_tracks |
artists_albums_map
audio_genres:流派
| 字段 |
解析 |
| _id |
主键。流派 id |
| name |
流派名称 |
audio_genres_map:音频流派映射
| 字段 |
解析 |
| _id |
主键。映射 id |
| audio_id |
音频 id |
| genre_id |
流派 id |
为何要建立映射表:为了消除数据冗余。假如有大量音频属于同一流派,如果没有映射表则需要每个音频都需要记录同样的流派数据,有了映射表之后则只有一条记录就够了。这符合数据库设计的第三范式(the 3rd normal form)
| 字段 |
解析 |
| _id |
主键。音频 id |
| _data |
文件绝对路径 |
| _display_name |
文件名 |
| _size |
文件大小,单位 byte |
| mime_type |
类似于 audio/mpeg 的 MIME 类型 |
| date_added |
添加到数据库的时间,单位秒 |
| is_drm |
是否有drm版权 |
| date_modified |
文件最后修改时间,单位秒 |
| title |
来自 ID3 信息的标题,无则为不带扩展名的文件名 |
| title_key |
全大写字母的标题 |
| duration |
时长 |
| artist_id |
艺术家 id |
| composer |
来自 ID3 信息,作曲家 |
| album_id |
专辑 id |
| track |
来自 ID3 信息,音轨 |
| year |
来自 ID3 信息,年代 |
| is_ringtone |
是否铃声,0 或 1 |
| is_music |
是否音乐,1 才会在音乐播放器显示 |
| is_alarm |
是否闹钟铃声 |
| is_notification |
是否通知铃声 |
| is_podcast |
是否 podcast |
| bookmark |
|
| album_artist |
audio_playlists:播放列表
| 字段 |
解析 |
| _id |
主键。播放列表 id |
| _data |
|
| name |
播放列表名 |
| date_added |
|
| date_modified |
audio_playlists_map:音频播放列表映射
| 字段 |
解析 |
| _id |
主键。映射 id |
| audio_id |
音频 id |
| playlist_id |
播放列表 id |
| play_order |
播放顺序 |